# -!- coding: utf-8 -!-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
中移动系统主流程图
#文件：flow_msydonline.py
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
from pycacho.cachobase.random_data import get_fromList

secret_status = 'Y'              # 验签、加解密状态(所有交互流程）
field_status = 'Y'               # 字段长度、数据类型、是否必填校验
apply_status = '11'              # 授信状态（0-授信中，1-通过，2-拒绝，R-规则引擎异常）
close_period = 8                 # 授信拒绝间隔天数
loan_status = 99                 # 借款状态（0-待放款，1-放款中，2-还款中，3-已退货，4-提前结清，5-正常结清，6-逾期，7-已解冻，8-办理通知失败）
credit_status = 'Y'              # 规则结果：Y-通过，N-拒绝，R-规则引擎异常

hb_loan_file = 'Y'               # 要放款的省份的文件是否已推送
loan_file_order = 'Y'            # 要放款的省份的文件是否有放款记录
repay_early = 'Y'                # 还款是否比放款提前（退货）
repay_status = 'S'               # 批量扣款明细回盘状态（W-处理中，S-成功，F-失败）


def flow_HB():
    print('京东商城选择购机套餐-->和包H5页面进行客户绑卡、身份认证等操作-->')


# 直接调用第三方征信流程
def direct_rule():
    flow = [
        "系统内部黑名系统",
        #"系统内部大数据平台",
        "腾讯云-天御反欺诈（腾讯天御分）接口",
        "同盾-贷前审查（信贷保镖API）",
        "百融-手机在网状态、时长及消费档次（信息验证策略Api）",
        "TalkingData-欺诈风险侦测"
    ]
    random_flow = get_fromList(flow,len(flow))
    for rule in random_flow:
        print('中移动直接随机调用'+rule+'结束，获取必要的字段！')


# 通过征信平台调用征信流程
def platform_rule():
    flow = [
        "天创--银行卡四要素",
        "天创--运营商三要素验证",
        "天创--手机二要素验证",
        "腾讯云--人脸核身接口",
        "百行征信--百行征信报告",
        "建信金科--慧评分查询接口",
        "建信金科--慧筛查查询接口"
    ]
    random_flow = get_fromList(flow,len(flow))
    for rule in random_flow:
        print('中移动通过征信平台随机调用'+rule+'结束，获取必要的字段！')


def flow_freeze():
    print('和包先发起调用借款实际出资方预查询 /loan-sgw/v1/channel/ jd-capital/act-capital-query 接口！')
    print('进件前对验签、加解密后对进件字段进行校验通过！')
    print('和包然后发起调用借款申请 /loan-sgw/v1/channel/jd-capital/loan-apply 接口！')
    print('验签、加解密状态（进件），字段长度、数据类型、是否必填校验通过，检查online_main是否有重复借款订单...')
    print( '校验通过后先判断客户和包号userId授信状态 online_main.credit_status ：')
    if apply_status == '1':
        print('客户已有授信成功的订单，然后判断客户和包号userId贷款状态 online_main.loan_status ：')
        if loan_status == 0:
            print('流程结束，客户已有待放款的订单，返回给和包 /gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款申请结果 loanApprovalStatus 为F-失败！')
            exit()
        elif loan_status == 1:
            print('流程结束，客户已有放款中的订单，返回给和包 /gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款申请结果 loanApprovalStatus 为F-失败！')
            exit()
        elif loan_status == 2:
            print('流程结束，客户已有还款中的订单，返回给和包 /gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款申请结果 loanApprovalStatus 为F-失败！')
            exit()
        elif loan_status == 6:
            print('流程结束，客户已有逾期的订单，返回给和包 /gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款申请结果 loanApprovalStatus 为F-失败！')
            exit()
        elif loan_status == 3:
            print('客户有已退货的订单，可以重新借款申请，将新订单信息存入到 online_main ,online_hb_usr 表原有和包信息备份到 online_hb_usr_history、并且更新online_hb_usr !')
        elif loan_status == 4:
            print('客户有提前结清的订单，可以重新借款申请，将新订单信息存入到 online_main ,online_hb_usr 表原有和包信息备份到 online_hb_usr_history、并且更新online_hb_usr !')
        elif loan_status == 5:
            print('客户有正常结清的订单，可以重新借款申请，将新订单信息存入到 online_main ,online_hb_usr 表原有和包信息备份到 online_hb_usr_history、并且更新online_hb_usr !')
        elif loan_status == 7:
            print('客户有已解冻的订单，可以重新借款申请，将新订单信息存入到 online_main ,online_hb_usr 表原有和包信息备份到 online_hb_usr_history、并且更新online_hb_usr !')
        elif loan_status == 8:
            print('客户有办理通知失败的订单，可以重新借款申请，将新订单信息存入到 online_main ,online_hb_usr 表原有和包信息备份到 online_hb_usr_history、并且更新online_hb_usr !')
    elif apply_status == '0':
        print('流程结束，客户已有授信中的订单，返回给和包贷款申请结果 loanApprovalStatus 为F-失败 ：')
        exit()
    elif apply_status == '2':
        print('客户已有授信拒绝的订单，然后判断拒绝的封闭期是否超过7天：')
        if close_period > 7:
            print('客户授信拒绝已过封闭期，可以重新借款申请，将新订单信息存入到 online_main ,online_hb_usr 表原有和包信息备份到 online_hb_usr_history、并且更新online_hb_usr !')
        else:
            print('流程结束，客户授信拒绝还在封闭期，返回给和包贷款申请结果 loanApprovalStatus 为F-失败 ：')
            exit()
    else:
        print('小贷数据库未有客户授信的订单记录，可以借款申请，将借款人的信息存入到表 online_hb_usr ，案件信息存到到 online_main....')

    print('对必要借款进件字段以及第三方借款规则字段进行组装(接口异常或者字段不返回，取默认值：字符类型取DEFAULT，数字类型取-989)，统一送入规则引擎系统！')
    print('规则引擎系统接收字段后跑相应的规则方案(数据库表ms_sys_config规则方案接口url)，最终反馈借款状态loanResult给到中移动系统！')
    if credit_status == 'Y':
        print('规则引擎通过，online_main 更新案件状态 credit_status 为1')
        print('中移动系统通过/gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款结果通知反馈 loanApprovalStatus 为S-成功 给到和包！')
    elif credit_status == 'N':
        print('流程结束，规则引擎拒绝，online_main 更新案件状态 credit_status 为2-授信失败')
        print('中移动系统通过/gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款结果通知反馈 loanApprovalStatus 为F-失败给到和包！')
    else:
        print('流程结束，规则引擎异常，online_main 更新案件状态 credit_status 为2-授信失败 ')
        print('中移动系统通过/gateway/loan-channel/v1/third/mpl/jd/loan-result-notify 贷款结果通知反馈 loanApprovalStatus 为F-失败给到和包！')
    print('和包也可以用 brwOrdNo 通过 /loan-sgw/v1/channel/jd-capital/loan-result-query接口查询用户借款状态！')


def freeze_rule():
    pass


def block_flow():
    print('和包发起调用提货人脸核身/cmpay/goods/v1/pwCompare接口，根据接口推送的和包号、借款订单号、提货图片进行人脸核身：')
    print('通过和包号查询pro_hb_usr中客户身份证、姓名，然后通过征信平台查询腾讯人脸核身接口，返回提货图片比对信息，然后存入到数据库表pick_face_verify')
    print('和包发起调用套餐办理通知/cmpay/quota/v1/block接口将办理成功订单推送过来！')
    print('验签、加解密状态（进件），字段长度、数据类型、是否必填校验通过，用户已借款状态（hb_usr.credit_status=F）后：')
    print('查询表pro_main中ext_serial_number是否是已借款成功、成功流程往下；查询表pkg_notice是否已有通知记录、无记录流程往下：')
    print('查询表hb_usr用户已借款状态（credit_status=F）、是冻结流程往下；查询表ms_loan是否记录、无记录流程往下；'
          '查询ms_product产品、ms_loanfeedef子产品信息后：')
    print('系统内部在数据库表pkg_notice记录办理套餐成功信息，并创建ms_loan借据表status为1-已签约状态、创建ms_repayment_plan还款计划表！')
    print('系统内部在数据库表hb_usr更新status状态为I-作废！')


def pay_flow():
    print('每天上午上班后运营登陆中移动后台管理系统，选择当天日期并且点击生成按钮：')
    print('先判断/data/sftp/hb/home/upload/hb/send/yymmdd是否已生成放款文件，已生成时不走下面流程,未生成重新生成走下面流程：')
    print('后台系统查询当天日期收到的分省业务办理确认文件HBCBF_省份编号_HBMS000001_01_文件日期_001.DAT，并且在数据库表ms_sys_config获取必须放款省份列表')
    if hb_loan_file == 'Y':
        print('获取必须放款省份的DAT文件名，根据file_prov_no、file_type、file_date查询看数据库表hb_loanfile是否已有记录，有记录更新记录、无记录插入一条数据')
        print('读取文件具体内容，根据brw_ord_no查询看数据库表pro_hb_loan是否有借款记录，有记录流程往下：')
        print('根据brw_ord_no查询看数据库表hb_loanfile_detail是否已有记录，有记录更新记录、无记录插入一条数据')
        print('更新数据库表hb_loanfile具体信息（file_status=1放款中、tol_money等）')
        print('最后会在/data/sftp/hb/home/upload/hb/send/yymmdd生成yymmddloanFile.xls')
    else:
        print('数据尚未全部获取，缺失省份编号为**,**')
    print('运营登陆中移动后台管理系统，选择当天日期并且下载按钮下载放款文件，如果未生成文件会提示：文件下载成功,未找到yymmdd日期的放款文件，请先生成文件')
    print('下载后运营可以将一些风控拒绝放款的订单删除，或者添加一些前面几天拒绝放款但又重新放款的订单，并且在页面点击导入按钮：')
    pay_plan()
    print('根据hb_loanfile_detail表loan_type为0状态的mpl_ord_no更新loan_type由0变为2-放款成功,file_date更新为导入文件的日期！')
    print('查询数据库表hb_loanfile_detail中放款成功状态file_date、file_prov_no是否存在!')
    print('查询数据库表hb_loanfile中file_type为1的file_date、file_prov_no是否存在！')
    if hb_loan_file == 'Y' and loan_file_order == 'Y':
        print('hb_loanfile_detail、hb_loanfile都存在记录时，生成回盘文件MPLCASH_18_888190900238401_SETTLE_20191019_001.DAT')
        print('查询数据库表ms_loan、hb_usr、ms_repayment_plan所有信息后，再查询sup_push_info是否已经合同报送，无记录：')
        print('进行金融局LoanContract、LoanInfo信息推送到报送平台！')
        print('进行百行征信SingleLoanAccount放款信息推送到报送平台！')
        print('查询sup_push_info看是否有还款被拒的金融局还款推送（退货比放款前）！')
        if repay_early == 'Y':
            print('更新sup_push_info中款报送状态result为N，并更新info中的还款日期repayTime为当前系统日期！')
        else:
            print('查询sup_push_info无还款被拒的金融局还款推送记录（退货比放款前）！')

    elif hb_loan_file == 'Y' and loan_file_order == 'N':
        print('hb_loanfile_detail无记录时，生成空回盘文件：更新hb_loanfile中file_status为6-已生成回盘文件')
    else:
        print('hb_loanfile_detail、hb_loanfile都不存在，不做处理！')


def pay_plan():
    # 正常流程：1.昨天已接口通知办理成功、文件也有；2.昨天接口未通知办理成功、但文件有；
    #          3.昨天已接口通知办理成功、但文件无（当天办理当天退货-ms_loan.status=7-已结清；不导入而且不会报送）；
    #          4.昨天已接口通知办理成功、文件也有，今天导入前办理了退货
    # 异常流程：1.N天前拒绝放款（接口已通知、接口未通知），重新放款；2.N天前拒绝放款（接口已通知、昨天导入文件后到今天导入文件前退货）
    pay_type = 1
    print('系统读取运营重新上传的放款文件，按和包借款订单号查询ms_loan表是否存在记录，状态status')
    if pay_type == 1:
        print('ms_loan表有记录并且状态为1，根据借款id更新status变为4,borrow_time、loan_expire_date保持不变！')
    elif pay_type == 2:
        print('ms_loan没有记录，查询表pro_main中该笔借款是否是借款成功、hb_usr用户已借款状态（credit_status=F）、是冻结流程往下：')
        print('查询表ms_loan是否记录、无记录流程往下；查询ms_product产品、ms_loanfeedef子产品信息后：')
        print('系统内部在数据库表ms_loan借据表status为1-已签约状态、创建ms_repayment_plan还款计划表！')
        print('系统内部在数据库表hb_usr更新status状态为I-作废，并且将ms_loan的status状态为4-放款成功!')
    elif pay_type == 4:
        print('ms_loan表有记录并且状态为7-已退货或提前结清，不更新数据！')


def repay_flow():
    print('和包先发起调用主动还款申请/cmpay/loan/v1/preview查询对应还款方式应还金额等信息！')
    print('系统收到主动还款申请后，查询ms_repay_order是否有status =N or status = M or status = P的记录，无记录流程往下：')
    print('查询ms_loan是否有记录，只要不是3-放款失败、7-已结清都可以进行还款；查询ms_repayment_plan、ms_plan的信息')
    print('和包发起调用扣款结果通知/cmpay/loan/v1/repayment接口推送还款信息！')
    print('验签、加解密状态（进件），字段长度、数据类型、是否必填校验通过，查询ms_repay_order是否有status =N or status = M or status = P的记录，无记录时流程往下：')
    print('查询ms_loan是否有记录，ms_repayment_plan、ms_plan的信息')
    print('查询ms_system_date当前系统业务时间business_date')
    # 主动还款：1-正常还某期，2.正常提前结清，3.正常退货（放款后再退货）；4.异常退货（放款前退货）；5.逾期还某一期；6.逾期后提前结清
    # 资金方发起：7.批扣文件
    # 资金方发起：8.主动扣款接口（暂时不开放）
    repay_type = 1
    if repay_type == 1:
        print('正常还某一期流程：插入1条记录到数据库表ms_plan、ms_repay_hst，更新ms_repayment_plan的1期repay_status为1-已结清、更新ms_plan的1期信息、,更新ms_loan信息')
        print('如果还最后一期,更新ms_loan的status为7-已结清')
    elif repay_type == 2:
        print('正常提前结清流程：')
    elif repay_type == 3:
        print('放款后再退货流程：分别插入24条记录到数据库表ms_plan、ms_repay_hst，更新ms_repayment_plan的24期repay_status为1-已结清、更新ms_plan的24期信息,更新ms_loan为已结清')
    elif repay_type == 4:
        print('文件未放款前就退货流程：')
    elif repay_type == 5:
        print('逾期还某一期流程：')
    elif repay_type == 6:
        print('逾期后提前结清流程：')
    elif repay_type == 7:
        batch_repay()
    print('根据和包号查询表hb_usr的一些用户信息，并且插入信息到ms_repay_order表')


# 资金方主动扣款(5.正常批扣，6.逾期批扣)
def batch_repay():
    flow_account()
    print('资金方主动批扣文件：到期还款日查询ms_loan为4、6状态的借据id,查询ms_repay_order是否有status =N or status = M or status = P的记录，无记录时流程往下：')
    print('查询ms_repayment_plan、ms_plan，有记录时判断是否在宽限期内-宽限期内不更新ms_plan、不在宽限期更新ms_plan，无记录时插入数据到ms_plan')
    print('然后查询hb_usr表用户信息，将还款信息预存入ms_repay_order表，status为N-新建')
    print('查询预存入ms_repay_order表的还款信息，汇总并写入到批量扣款文件,并且根据还款id逐条写入到批量扣款文件')
    print('合并信息到文件/data/sftp/hb/home/upload/hb/send/20191102/MPLCASH_999999999999999_DEDUCTION_20191102_001.DAT')
    print('每天10点半去当业务日期sftp目录获取和包批量扣款明细回盘文件 BACK_MPLCASH_999999999999999_DEDUCTION_20191102_001.DAT：')
    print('逐条获取回盘的还款信息，只处理成功或者失败的订单：')
    if repay_status == 'S':
        print('根据和包借款订单号查询ms_repay_order是否有status =N or status = M or status = P的记录，有记录时更新ms_repay_order状态和金额等信息')
        print('查询表ms_loan、ms_repayment_plan、ms_plan的一些信息，并且插入还款本金、还款利息2条记录到ms_repay_hst表')
        print('最后更新表ms_loan已还信息、ms_repayment_plan已还期数状态、ms_plan的信息为0、ms_repay_order还款相关信息')
    elif repay_status == 'F':
        print('根据和包借款订单号查询ms_repay_order是否有status =N or status = M or status = P的记录，有记录时只更新ms_repay_order状态')
    else:
        print('处理中的订单，不做任何处理.....')


def flow_account():
    print('自动任务先进行账务批处理流程(逾期、当前期数)')
    print('到期还款日当天跑批：查询ms_loan中4、6状态订单,查询ms_repayment_plan、ms_plan记录，更新ms_loan的overdue_date,paid_out_date,status,curr_bal,remain_term ,penalty_acru，last_process_date为业务时间')
    print('到期还款日后一天跑批：查询ms_loan中4、6状态订单,查询ms_repayment_plan、ms_plan记录，更新curr_term、remain_term'
          '更新ms_loan的overdue_date,paid_out_date,status,curr_bal,remain_term ,penalty_acru，last_process_date为业务时间')
    print('所有任务结束后更新ms_system_date的process_date为当前日期')


def flow():
    flow_HB()
    flow_freeze()
    print('\n')

if __name__ == '__main__':
    flow()